# -*- coding: utf-8 -*-
"""
创建Excel数据驱动测试示例文件
生成包含多种测试场景的Excel测试数据
"""

import pandas as pd
from pathlib import Path
import logging
from datetime import datetime


def create_example_excel_file():
    """
    创建Excel数据驱动测试示例文件
    
    包含以下工作表:
    1. 用户管理测试 - 用户CRUD操作测试用例
    2. 错误处理测试 - 各种异常场景测试用例
    3. 性能测试 - 性能相关测试用例
    """
    
    logger = logging.getLogger(__name__)
    
    # 用户管理测试用例数据
    user_management_cases = [
        {
            'test_case_id': 'USER_001',
            'test_name': '创建用户-正常流程',
            'description': '使用有效数据创建新用户',
            'api_method': 'POST',
            'api_path': '/api/v1/users',
            'name': '张三',
            'email': 'zhangsan@example.com',
            'age': 25,
            'expected_status': 201,
            'expected_result': 'success',
            'priority': 'high',
            'tags': 'smoke,regression'
        },
        {
            'test_case_id': 'USER_002',
            'test_name': '创建用户-特殊字符',
            'description': '使用包含特殊字符的数据创建用户',
            'api_method': 'POST',
            'api_path': '/api/v1/users',
            'name': '李四@#$',
            'email': 'lisi.test@example.com',
            'age': 30,
            'expected_status': 201,
            'expected_result': 'success',
            'priority': 'medium',
            'tags': 'regression'
        },
        {
            'test_case_id': 'USER_003',
            'test_name': '创建用户-边界值测试',
            'description': '测试年龄边界值',
            'api_method': 'POST',
            'api_path': '/api/v1/users',
            'name': '王五',
            'email': 'wangwu@example.com',
            'age': 18,
            'expected_status': 201,
            'expected_result': 'success',
            'priority': 'medium',
            'tags': 'boundary'
        },
        {
            'test_case_id': 'USER_004',
            'test_name': '查询所有用户',
            'description': '获取用户列表',
            'api_method': 'GET',
            'api_path': '/api/v1/users',
            'name': '',
            'email': '',
            'age': '',
            'expected_status': 200,
            'expected_result': 'success',
            'priority': 'high',
            'tags': 'smoke,regression'
        },
        {
            'test_case_id': 'USER_005',
            'test_name': '查询用户详情',
            'description': '根据ID查询用户详情',
            'api_method': 'GET',
            'api_path': '/api/v1/users/1',
            'name': '',
            'email': '',
            'age': '',
            'expected_status': 200,
            'expected_result': 'success',
            'priority': 'high',
            'tags': 'smoke,regression'
        },
        {
            'test_case_id': 'USER_006',
            'test_name': '更新用户信息',
            'description': '更新现有用户的信息',
            'api_method': 'PUT',
            'api_path': '/api/v1/users/1',
            'name': '张三更新',
            'email': 'zhangsan.updated@example.com',
            'age': 26,
            'expected_status': 200,
            'expected_result': 'success',
            'priority': 'medium',
            'tags': 'regression'
        }
    ]
    
    # 错误处理测试用例数据
    error_handling_cases = [
        {
            'test_case_id': 'ERR_001',
            'test_name': '创建用户-缺少必填字段',
            'description': '创建用户时缺少name字段',
            'api_method': 'POST',
            'api_path': '/api/v1/users',
            'name': '',
            'email': 'test@example.com',
            'age': 25,
            'expected_status': 422,
            'expected_result': 'error',
            'priority': 'high',
            'tags': 'negative,validation'
        },
        {
            'test_case_id': 'ERR_002',
            'test_name': '创建用户-邮箱格式错误',
            'description': '使用无效的邮箱格式',
            'api_method': 'POST',
            'api_path': '/api/v1/users',
            'name': '测试用户',
            'email': 'invalid-email',
            'age': 25,
            'expected_status': 422,
            'expected_result': 'error',
            'priority': 'medium',
            'tags': 'negative,validation'
        },
        {
            'test_case_id': 'ERR_003',
            'test_name': '创建用户-年龄超出范围',
            'description': '年龄值超出有效范围',
            'api_method': 'POST',
            'api_path': '/api/v1/users',
            'name': '测试用户',
            'email': 'test@example.com',
            'age': 200,
            'expected_status': 422,
            'expected_result': 'error',
            'priority': 'medium',
            'tags': 'negative,boundary'
        },
        {
            'test_case_id': 'ERR_004',
            'test_name': '查询不存在的用户',
            'description': '查询不存在的用户ID',
            'api_method': 'GET',
            'api_path': '/api/v1/users/99999',
            'name': '',
            'email': '',
            'age': '',
            'expected_status': 404,
            'expected_result': 'error',
            'priority': 'medium',
            'tags': 'negative,notfound'
        },
        {
            'test_case_id': 'ERR_005',
            'test_name': '重复邮箱创建用户',
            'description': '使用已存在的邮箱创建用户',
            'api_method': 'POST',
            'api_path': '/api/v1/users',
            'name': '重复用户',
            'email': 'duplicate@example.com',
            'age': 25,
            'expected_status': 409,
            'expected_result': 'error',
            'priority': 'high',
            'tags': 'negative,duplicate'
        }
    ]
    
    # 性能测试用例数据
    performance_cases = [
        {
            'test_case_id': 'PERF_001',
            'test_name': '用户列表查询性能',
            'description': '测试用户列表查询的响应时间',
            'api_method': 'GET',
            'api_path': '/api/v1/users',
            'name': '',
            'email': '',
            'age': '',
            'expected_status': 200,
            'expected_result': 'success',
            'priority': 'low',
            'tags': 'performance',
            'max_response_time': 1000  # 毫秒
        },
        {
            'test_case_id': 'PERF_002',
            'test_name': '创建用户性能',
            'description': '测试创建用户的响应时间',
            'api_method': 'POST',
            'api_path': '/api/v1/users',
            'name': '性能测试用户',
            'email': 'perf.test@example.com',
            'age': 25,
            'expected_status': 201,
            'expected_result': 'success',
            'priority': 'low',
            'tags': 'performance',
            'max_response_time': 2000  # 毫秒
        }
    ]
    
    # 系统接口测试用例
    system_cases = [
        {
            'test_case_id': 'SYS_001',
            'test_name': '健康检查接口',
            'description': '检查系统健康状态',
            'api_method': 'GET',
            'api_path': '/health',
            'name': '',
            'email': '',
            'age': '',
            'expected_status': 200,
            'expected_result': 'success',
            'priority': 'critical',
            'tags': 'smoke,health'
        },
        {
            'test_case_id': 'SYS_002',
            'test_name': '根路径接口',
            'description': '测试根路径响应',
            'api_method': 'GET',
            'api_path': '/',
            'name': '',
            'email': '',
            'age': '',
            'expected_status': 200,
            'expected_result': 'success',
            'priority': 'high',
            'tags': 'smoke,basic'
        }
    ]
    
    # 创建Excel文件
    excel_file_path = Path(__file__).parent / "example_test_cases.xlsx"
    
    with pd.ExcelWriter(excel_file_path, engine='openpyxl') as writer:
        # 用户管理测试工作表
        user_df = pd.DataFrame(user_management_cases)
        user_df.to_excel(writer, sheet_name='用户管理测试', index=False)
        
        # 错误处理测试工作表
        error_df = pd.DataFrame(error_handling_cases)
        error_df.to_excel(writer, sheet_name='错误处理测试', index=False)
        
        # 性能测试工作表
        perf_df = pd.DataFrame(performance_cases)
        perf_df.to_excel(writer, sheet_name='性能测试', index=False)
        
        # 系统接口测试工作表
        system_df = pd.DataFrame(system_cases)
        system_df.to_excel(writer, sheet_name='系统接口测试', index=False)
        
        # 所有测试用例汇总工作表
        all_cases = user_management_cases + error_handling_cases + performance_cases + system_cases
        all_df = pd.DataFrame(all_cases)
        all_df.to_excel(writer, sheet_name='所有测试用例', index=False)
    
    logger.info(f"Excel示例文件已创建: {excel_file_path}")
    logger.info(f"包含工作表: 用户管理测试({len(user_management_cases)}个用例), "
               f"错误处理测试({len(error_handling_cases)}个用例), "
               f"性能测试({len(performance_cases)}个用例), "
               f"系统接口测试({len(system_cases)}个用例)")
    logger.info(f"总计: {len(all_cases)} 个测试用例")
    
    return excel_file_path


def create_advanced_example():
    """
    创建高级Excel示例，包含更复杂的测试场景
    """
    
    # 批量操作测试用例
    batch_cases = []
    
    # 生成多个用户创建测试用例
    for i in range(1, 11):
        case = {
            'test_case_id': f'BATCH_{i:03d}',
            'test_name': f'批量创建用户_{i}',
            'description': f'批量测试第{i}个用户创建',
            'api_method': 'POST',
            'api_path': '/api/v1/users',
            'name': f'批量用户{i}',
            'email': f'batch.user{i}@example.com',
            'age': 20 + (i % 30),  # 年龄在20-49之间变化
            'expected_status': 201,
            'expected_result': 'success',
            'priority': 'medium',
            'tags': f'batch,user{i}'
        }
        batch_cases.append(case)
    
    # 边界值测试用例
    boundary_cases = [
        {
            'test_case_id': 'BOUND_001',
            'test_name': '最小年龄边界测试',
            'description': '测试最小允许年龄',
            'api_method': 'POST',
            'api_path': '/api/v1/users',
            'name': '最小年龄用户',
            'email': 'min.age@example.com',
            'age': 1,
            'expected_status': 201,
            'expected_result': 'success',
            'priority': 'high',
            'tags': 'boundary,min'
        },
        {
            'test_case_id': 'BOUND_002',
            'test_name': '最大年龄边界测试',
            'description': '测试最大允许年龄',
            'api_method': 'POST',
            'api_path': '/api/v1/users',
            'name': '最大年龄用户',
            'email': 'max.age@example.com',
            'age': 120,
            'expected_status': 201,
            'expected_result': 'success',
            'priority': 'high',
            'tags': 'boundary,max'
        },
        {
            'test_case_id': 'BOUND_003',
            'test_name': '零年龄边界测试',
            'description': '测试年龄为0的情况',
            'api_method': 'POST',
            'api_path': '/api/v1/users',
            'name': '零年龄用户',
            'email': 'zero.age@example.com',
            'age': 0,
            'expected_status': 422,
            'expected_result': 'error',
            'priority': 'high',
            'tags': 'boundary,zero,negative'
        }
    ]
    
    # 创建高级Excel文件
    excel_file_path = Path(__file__).parent / "advanced_test_cases.xlsx"
    
    with pd.ExcelWriter(excel_file_path, engine='openpyxl') as writer:
        # 批量测试工作表
        batch_df = pd.DataFrame(batch_cases)
        batch_df.to_excel(writer, sheet_name='批量测试', index=False)
        
        # 边界值测试工作表
        boundary_df = pd.DataFrame(boundary_cases)
        boundary_df.to_excel(writer, sheet_name='边界值测试', index=False)
    
    print(f"高级Excel示例文件已创建: {excel_file_path}")
    return excel_file_path


if __name__ == '__main__':
    # 配置日志
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    )
    
    print("创建Excel数据驱动测试示例文件...")
    
    # 创建基础示例
    basic_file = create_example_excel_file()
    print(f"✅ 基础示例文件已创建: {basic_file}")
    
    # 创建高级示例
    advanced_file = create_advanced_example()
    print(f"✅ 高级示例文件已创建: {advanced_file}")
    
    print("\n📋 Excel文件包含以下测试场景:")
    print("1. 用户管理测试 - CRUD操作")
    print("2. 错误处理测试 - 异常场景")
    print("3. 性能测试 - 响应时间验证")
    print("4. 系统接口测试 - 基础功能")
    print("5. 批量测试 - 大量数据测试")
    print("6. 边界值测试 - 边界条件验证")
    
    print("\n🚀 使用方法:")
    print("pytest tests/test_excel_data_driven_example.py -v --allure-results-directory=allure-results")